/* * Sun Public License Notice * * The contents of this file are subject to the Sun Public License * Version 1.0 (the "License"). You may not use this file except in * compliance with the License. A copy of the License is available at * http://www.sun.com/ * * The Original Code is Forte for Java, Community Edition. The Initial * Developer of the Original Code is Sun Microsystems, Inc. Portions * Copyright 1997-2000 Sun Microsystems, Inc. All Rights Reserved. */ package org.netbeans.modules.editor.java; import java.io.File; import java.io.FilenameFilter; import java.io.IOException; import java.io.InputStream; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.ObjectInputStream; import java.io.ObjectOutputStream; import java.util.ArrayList; import java.util.Iterator; import java.util.List; import org.netbeans.editor.ext.JCompletion; import org.netbeans.editor.ext.JCUtilities; import org.netbeans.editor.ext.JCClass; import org.netbeans.editor.ext.JCClassProvider; import org.netbeans.editor.ext.JCFileProvider; import org.netbeans.editor.ext.JCQuery; import org.netbeans.editor.ext.JCFinder; import org.netbeans.editor.ext.JCBaseFinder; import org.openide.execution.NbClassPath; import org.openide.filesystems.FileObject; import org.openide.filesystems.FileUtil; /** * Management of Java Completion storage * * @author Miloslav Metelka * @version 1.00 */ public class JCStorage { private static final String DB_DIR = "ParserDB"; // NOI18N private static final String JCS_EXT = "jcs"; // NOI18N private static final String STORAGE = "storage"; // NOI18N private static final String STORAGE_EXT = "ser"; // NOI18N private static final String PROVIDER_FILE_EXT = JCFileProvider.SKEL_FILE_EXT; private static boolean inited; private static JCStorage storage; private FileObject dbFolder; // parser db folder /** * @associates JCStorageElement */ private ArrayList elementList = new ArrayList(); public static JCStorage getStorage() { return storage; } public static void init(FileObject rootFolder) { JCFinder finder = new JCBaseFinder(); JCompletion.setFinder(finder); storage = new JCStorage(rootFolder); } JCStorage(FileObject rootFolder) { checkDBFolder(rootFolder); if (dbFolder != null) { initElements(); initProviders(); initFinder(); } } private void checkDBFolder(FileObject rootFolder) { if (rootFolder != null) { dbFolder = rootFolder.getFileObject(DB_DIR); if (dbFolder == null) { try { dbFolder = rootFolder.createFolder(DB_DIR); } catch (IOException e) { // probably exists or cannot be created } } } } private File getStorageFile() { File storage = null; if (dbFolder != null) { FileObject storageFO = dbFolder.getFileObject(STORAGE, STORAGE_EXT); try { if (storageFO == null) { storageFO = dbFolder.createData(STORAGE, STORAGE_EXT); } } catch (IOException e) { } if (storageFO != null) { storage = NbClassPath.toFile(storageFO); } } return storage; } private void initElements() { try { File storage = getStorageFile(); if (storage != null) { if (storage.exists()) { ObjectInputStream is = new ObjectInputStream(new FileInputStream(storage)); elementList = (ArrayList)is.readObject(); is.close(); } } } catch (ClassNotFoundException e) { } catch (IOException e) { } } private void initFinder() { JCFinder finder = JCompletion.getFinder(); Iterator i = elementList.iterator(); while (i.hasNext()) { JCStorageElement e = (JCStorageElement)i.next(); if (e.getProvider() != null) { finder.append(e.getProvider()); } } } public void saveElements() { try { File storage = getStorageFile(); if (storage != null) { ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream(storage)); os.writeObject(elementList); os.close(); } } catch (IOException e) { } } public JCStorageElement getElement(String name) { int i = elementList.indexOf(new JCStorageElement(name)); if (i >= 0) { return (JCStorageElement)elementList.get(i); } else { return null; } } private void initProviders() { if (dbFolder != null) { File dbDir = NbClassPath.toFile(dbFolder); if (dbDir != null) { String[] names = dbDir.list( new FilenameFilter() { public boolean accept(File dir, String name) { return name.endsWith(PROVIDER_FILE_EXT); } } ); for (int i = 0; i < names.length; i++) { String name = names[i].substring(0, names[i].length() - PROVIDER_FILE_EXT.length()); String prefix = dbDir.getAbsolutePath() + File.separator + name; JCClassProvider provider = new JCFileProvider(prefix); JCStorageElement e = getElement(name); if (e != null) { e.setProvider(provider); } else { e = new JCStorageElement(name); e.setProvider(provider); addElement(e); } } } } } JCStorageElement findFileSystemElement(String fsName) { Iterator i = elementList.iterator(); while (i.hasNext()) { JCStorageElement e = (JCStorageElement)i.next(); if (fsName.equals(e.getFileSystemName())) { return e; } } return null; } void removeFileSystemElement(String fsName) { int cnt = elementList.size(); for (int i = 0; i < cnt; i++) { if (fsName.equals(((JCStorageElement)elementList.get(i)).getFileSystemName())) { elementList.remove(i); cnt--; } } } private void addElement(JCStorageElement e) { int i = elementList.indexOf(e); if (i >= 0) { elementList.set(i, e); } else { elementList.add(e); } } public JCStorageElement addElement( String name, String fsName, int classLevel, int fieldLevel, int methodLevel) { JCStorageElement e = new JCStorageElement(name, fsName, classLevel, fieldLevel, methodLevel); removeFileSystemElement(fsName); addElement(e); saveElements(); return e; } public void checkProvider(JCStorageElement e) { if (e.getProvider() == null && dbFolder != null) { File dbDir = NbClassPath.toFile(dbFolder); if (dbDir != null) { JCClassProvider cp = new JCFileProvider( new File(dbDir, e.getName()).getAbsolutePath()); cp.reset(); e.setProvider(cp); } } } public static void main(String[] args) { if (args.length != 5) { System.err.println("arg1=base-source-dir arg2=target-file-prefix arg3=class-level" // NOI18N + " arg4=field-level arg5=method-level\n" // NOI18N + "Storage level: 0=all, 1=not private 2=public and protected, 3=public only\n" // NOI18N + "Example of args: e:\\java\\jdk12\\src e:\\NB\\system\\ParserDB\\jdk12 2 2 2"); // NOI18N return; } int classLevel = Integer.parseInt(args[2]); int fieldLevel = Integer.parseInt(args[3]); int methodLevel = Integer.parseInt(args[4]); System.out.println("Inspecting classes ..."); // NOI18N List classNameList = JCUtilities.getClassNameList(args[0]); List classList = JCUtilities.getClassList(classNameList, true, classLevel, fieldLevel, methodLevel); final int cnt[] = new int[1]; JCFileProvider fp = new JCFileProvider(args[1]); fp.reset(); JCompletion.ListProvider classes = new JCompletion.ListProvider(classList) { public boolean notifyAppend(JCClass c, boolean appendFinished) { if (appendFinished) { System.out.print("Building " + c.getFullName() + " ... \r"); // NOI18N cnt[0]++; } return true; } }; long tm = System.currentTimeMillis(); fp.append(classes); System.out.println(cnt[0] + " classes rebuilt in " + (System.currentTimeMillis() - tm) + "ms."); // NOI18N File skels = new File(args[1] + JCFileProvider.SKEL_FILE_EXT); File bodies = new File(args[1] + JCFileProvider.BODY_FILE_EXT); System.out.println("Files created:\nSkeleton file: " // NOI18N + skels.getAbsolutePath() + ", length=" + skels.length() // NOI18N + "\nBody file: " + bodies.getAbsolutePath() // NOI18N + ", length=" + bodies.length()); // NOI18N System.exit(0); } public String toString() { StringBuffer sb = new StringBuffer(); Iterator i = elementList.iterator(); while (i.hasNext()) { sb.append(((JCStorageElement)i.next()).toString()); sb.append('\n'); } return sb.toString(); } } /* * Log * 11 Gandalf 1.10 1/26/00 Miloslav Metelka removed jdk12.jar * 10 Gandalf 1.9 1/13/00 Miloslav Metelka Localization * 9 Gandalf 1.8 1/10/00 Miloslav Metelka * 8 Gandalf 1.7 11/14/99 Miloslav Metelka * 7 Gandalf 1.6 11/8/99 Miloslav Metelka * 6 Gandalf 1.5 10/23/99 Ian Formanek NO SEMANTIC CHANGE - Sun * Microsystems Copyright in File Comment * 5 Gandalf 1.4 9/15/99 Miloslav Metelka * 4 Gandalf 1.3 7/22/99 Miloslav Metelka * 3 Gandalf 1.2 7/21/99 Miloslav Metelka * 2 Gandalf 1.1 7/21/99 Miloslav Metelka * 1 Gandalf 1.0 7/20/99 Miloslav Metelka * $ */